package com.mano.mall.common.base;

import com.mano.mall.common.constants.Constants;
import com.mano.mall.common.utils.MyBeanUtils;
import lombok.Data;
import org.springframework.stereotype.Component;

/**
 * 微服务接口实现该接口可以使用传递参数可以直接封装统一返回结果集
 * @param <T>
 */
@Data
@Component
public class BaseApiService<T> {

	public BaseResponse<T> setResultError(Integer code, String msg) {
		return setResult(code, msg, null);
	}

	// 返回错误，可以传msg
	public BaseResponse<T> setResultError(String msg) {
		return setResult(Constants.HTTP_RES_CODE_500, msg, null);
	}

	// 返回成功，可以传data值
	public BaseResponse<T> setResultSuccess(T data) {
		return setResult(Constants.HTTP_RES_CODE_200, Constants.HTTP_RES_CODE_200_VALUE, data);
	}

	// 封装 返回 DTO
	public BaseResponse<T> setResultSuccessDTO(Object obj){
		Class aClass = MyBeanUtils.getParameterizedType(getClass());
		return setResultSuccess((T) MyBeanUtils.doToDto(obj, aClass));
	}

	// 返回成功，沒有data值
	public BaseResponse<T> setResultSuccess() {
		return setResult(Constants.HTTP_RES_CODE_200, Constants.HTTP_RES_CODE_200_VALUE, null);
	}

	// 返回成功，沒有data值
	public BaseResponse<T> setResultSuccess(String msg) {
		return setResult(Constants.HTTP_RES_CODE_200, msg, null);
	}

	// 通用封装
	public BaseResponse<T> setResult(Integer code, String msg, T data) {
		return new BaseResponse<T>(code, msg, data);
	}


	// 调用数据库层判断
	public Boolean toDaoResult(int result) {
		return result > 0 ? true : false;
	}

	public Boolean isSuccess(BaseResponse<?> baseResp) {
		if (baseResp == null) {
			return false;
		}
		if (!baseResp.getCode().equals(Constants.HTTP_RES_CODE_200)) {
			return false;
		}
		return true;
	}

	public Boolean isSuccessData(BaseResponse<?> baseResponse){
		if(isSuccess(baseResponse)){
			Object responseData = baseResponse.getData();
			return responseData == null? false:true;
		}
		return false;
	}

	/**
	 * 默认的 callback 方法
	 * @param msg
	 * @return
	 */
	public BaseResponse<T> defaultCallBackMethod(String msg){
		return setResultError("服务器忙，请售后重置");
	}

}
